import dxos from './dxOs.js'
import dxstd from './dxStd.js'
import logger from './dxLogger.js'
/**
 * Timezone Management Module (dxTimeZones)
 *
 * @description
 * Provides comprehensive timezone management with multi-language support. This module contains
 * a curated list of 45 major timezones worldwide, each with UTC offset information and localized
 * names in 9 languages (Chinese, English, Japanese, Korean, Spanish, French, German, Russian, Arabic).
 * Additionally, it supports updating to any timezone file present in the zoneinfo directory, even if
 * not included in the predefined list.
 *
 * @feature
 * - **Multi-Language Support**: Each timezone includes translations in 9 languages for UI display.
 * - **UTC Offset Information**: Provides standardized UTC offset for each timezone.
 * - **System Timezone Update**: Allows updating the system timezone by copying zoneinfo files.
 * - **Custom Timezone Support**: Can update to any timezone file in the zoneinfo directory, not limited to the 45 predefined ones.
 * - **Language Validation**: Ensures only supported languages are used when filtering timezones.
 * - **Device Reboot**: Provides a safe reboot function to apply timezone changes.
 *
 * @note
 * For simple timezone updates using GMT offset only (e.g., GMT+8, GMT-5), consider using the
 * `updateGmt()` function from the **dxNtp** module, which provides a simpler interface for
 * basic GMT offset-based timezone configuration without requiring full zoneinfo files.
 *
 * @timezoneData
 * The module includes 45 timezones covering major cities and regions worldwide:
 * - Americas: From Pacific/Midway (UTC-11) to America/Argentina/Buenos_Aires (UTC-3)
 * - Europe & Africa: From Atlantic/Azores (UTC-1) to Europe/Istanbul (UTC+3)
 * - Asia & Pacific: From Asia/Dubai (UTC+4) to Pacific/Tongatapu (UTC+13)
 *
 * @supportedLanguages
 * - zh: Chinese (中文)
 * - en: English
 * - ja: Japanese (日本語)
 * - ko: Korean (한국어)
 * - es: Spanish (Español)
 * - fr: French (Français)
 * - de: German (Deutsch)
 * - ru: Russian (Русский)
 * - ar: Arabic (العربية)
 *
 * @example
 * // --- Get all timezones with full language data ---
 * import tz from '../dxmodules/dxTimeZones.js';
 * 
 * const allTimezones = tz.getTimeZones();
 * // Returns: { "Pacific/Midway": { utc_offset: "-11:00", name: { zh: "...", en: "...", ... } }, ... }
 *
 * // --- Get timezones filtered by language ---
 * const chineseTimezones = tz.getTimeZones('zh');
 * // Returns: { "Pacific/Midway": { utc_offset: "-11:00", name: "萨摩亚标准时间（中途岛）" }, ... }
 *
 * const englishTimezones = tz.getTimeZones('en');
 * // Returns: { "Pacific/Midway": { utc_offset: "-11:00", name: "Samoa Standard Time (Midway)" }, ... }
 *
 * // --- Update system timezone (from predefined list) ---
 * try {
 *   tz.updateTimeZone('Asia/Shanghai');
 *   // Timezone file copied to /etc/localtime
 *   // Now reboot to apply changes
 *   tz.reboot();
 * } catch (e) {
 *   logger.error('Failed to update timezone:', e.message);
 * }
 *
 * // --- Update to custom timezone (any file in zoneinfo directory) ---
 * try {
 *   tz.updateTimeZone('Europe/Kyiv'); // Not in predefined list, but file exists
 *   // Works as long as the file exists at /app/code/dxmodules/zoneinfo/Europe/Kyiv
 * } catch (e) {
 *   logger.error('Timezone file not found:', e.message);
 * }
 *
 * // --- Simple GMT offset-based timezone update (using dxNtp) ---
 * // For basic use cases, you can use dxNtp module for simpler GMT-based timezone updates:
 * import ntp from '../dxmodules/dxNtp.js';
 * ntp.updateGmt(8); // Set to GMT+8 (e.g., Beijing time)
 *
 * // --- Validate language support ---
 * try {
 *   tz.getTimeZones('invalid'); // Throws error
 * } catch (e) {
 *   // Error: Language invalid not supported
 * }
 */

const timezones = {
    "Pacific/Midway": {
        "utc_offset": "-11:00",
        "name": {
            "zh": "萨摩亚标准时间（中途岛）",
            "en": "Samoa Standard Time (Midway)",
            "ja": "サモア標準時（ミッドウェイ）",
            "ko": "사모아 표준시 (미드웨이)",
            "es": "Hora Estándar de Samoa (Midway)",
            "fr": "Heure Standard de Samoa (Midway)",
            "de": "Samoa-Standardzeit (Midway)",
            "ru": "Самоанское стандартное время (Мидуэй)",
            "ar": "التوقيت القياسي لساموا (ميدواي)"
        }
    },
    "America/Adak": {
        "utc_offset": "-10:00",
        "name": {
            "zh": "夏威夷-阿留申标准时间（阿达克）",
            "en": "Hawaii-Aleutian Standard Time (Adak)",
            "ja": "ハワイ・アリューシャン標準時（アダック）",
            "ko": "하와이-알류샨 표준시 (아닥)",
            "es": "Hora Estándar de Hawái-Aleutianas (Adak)",
            "fr": "Heure Standard d'Hawaï-Aléoutiennes (Adak)",
            "de": "Hawaii-Aleuten-Standardzeit (Adak)",
            "ru": "Гавайско-Алеутское стандартное время (Адак)",
            "ar": "التوقيت القياسي لهاواي-ألوشيان (أداك)"
        }
    },
    "Pacific/Honolulu": {
        "utc_offset": "-10:00",
        "name": {
            "zh": "夏威夷标准时间",
            "en": "Hawaii Standard Time",
            "ja": "ハワイ標準時",
            "ko": "하와이 표준시",
            "es": "Hora Estándar de Hawái",
            "fr": "Heure Standard d'Hawaï",
            "de": "Hawaii-Standardzeit",
            "ru": "Гавайское стандартное время",
            "ar": "التوقيت القياسي لهاواي"
        }
    },
    "America/Anchorage": {
        "utc_offset": "-09:00",
        "name": {
            "zh": "阿拉斯加标准时间",
            "en": "Alaska Standard Time",
            "ja": "アラスカ標準時",
            "ko": "알래스카 표준시",
            "es": "Hora Estándar de Alaska",
            "fr": "Heure Standard de l'Alaska",
            "de": "Alaska-Standardzeit",
            "ru": "Аляскинское стандартное время",
            "ar": "التوقيت القياسي لألاسكا"
        }
    },
    "America/Los_Angeles": {
        "utc_offset": "-08:00",
        "name": {
            "zh": "太平洋标准时间（洛杉矶）",
            "en": "Pacific Standard Time (Los Angeles)",
            "ja": "太平洋標準時（ロサンゼルス）",
            "ko": "태평양 표준시 (로스앤젤레스)",
            "es": "Hora Estándar del Pacífico (Los Ángeles)",
            "fr": "Heure Standard du Pacifique (Los Angeles)",
            "de": "Pazifische Standardzeit (Los Angeles)",
            "ru": "Тихоокеанское стандартное время (Лос-Анджелес)",
            "ar": "توقيت المحيط الهادئ (لوس أنجلوس)"
        }
    },
    "America/Denver": {
        "utc_offset": "-07:00",
        "name": {
            "zh": "山地标准时间（丹佛）",
            "en": "Mountain Standard Time (Denver)",
            "ja": "山岳部標準時（デンバー）",
            "ko": "산악 표준시 (덴버)",
            "es": "Hora Estándar de la Montaña (Denver)",
            "fr": "Heure Standard des Rocheuses (Denver)",
            "de": "Rocky-Mountain-Standardzeit (Denver)",
            "ru": "Горное стандартное время (Денвер)",
            "ar": "التوقيت الجبلي (دنفر)"
        }
    },
    "America/Chicago": {
        "utc_offset": "-06:00",
        "name": {
            "zh": "中部标准时间（芝加哥）",
            "en": "Central Standard Time (Chicago)",
            "ja": "中部標準時（シカゴ）",
            "ko": "중부 표준시 (시카고)",
            "es": "Hora Estándar Central (Chicago)",
            "fr": "Heure Standard du Centre (Chicago)",
            "de": "Central-Standardzeit (Chicago)",
            "ru": "Центральное стандартное время (Чикаго)",
            "ar": "التوقيت المركزي (شيكاغو)"
        }
    },
    "America/New_York": {
        "utc_offset": "-05:00",
        "name": {
            "zh": "东部标准时间（纽约）",
            "en": "Eastern Standard Time (New York)",
            "ja": "東部標準時（ニューヨーク）",
            "ko": "동부 표준시 (뉴욕)",
            "es": "Hora Estándar del Este (Nueva York)",
            "fr": "Heure Standard de l'Est (New York)",
            "de": "Östliche Standardzeit (New York)",
            "ru": "Восточное стандартное время (Нью-Йорк)",
            "ar": "التوقيت الشرقي (نيويورك)"
        }
    },
    "America/Toronto": {
        "utc_offset": "-05:00",
        "name": {
            "zh": "东部标准时间（多伦多）",
            "en": "Eastern Standard Time (Toronto)",
            "ja": "東部標準時（トロント）",
            "ko": "동부 표준시 (토론토)",
            "es": "Hora Estándar del Este (Toronto)",
            "fr": "Heure Standard de l'Est (Toronto)",
            "de": "Östliche Standardzeit (Toronto)",
            "ru": "Восточное стандартное время (Торонто)",
            "ar": "التوقيت الشرقي (تورونتو)"
        }
    },
    "America/Mexico_City": {
        "utc_offset": "-06:00",
        "name": {
            "zh": "墨西哥中部时间（墨西哥城）",
            "en": "Central Time (Mexico City)",
            "ja": "中部時間（メキシコシティ）",
            "ko": "중부 시간 (멕시코시티)",
            "es": "Hora Central (Ciudad de México)",
            "fr": "Heure du Centre (Mexico)",
            "de": "Zentralzeit (Mexiko-Stadt)",
            "ru": "Центральное время (Мехико)",
            "ar": "التوقيت المركزي (مكسيكو سيتي)"
        }
    },
    "America/Bogota": {
        "utc_offset": "-05:00",
        "name": {
            "zh": "哥伦比亚时间（波哥大）",
            "en": "Colombia Time (Bogotá)",
            "ja": "コロンビア時間（ボゴタ）",
            "ko": "콜롬비아 시간 (보고타)",
            "es": "Hora de Colombia (Bogotá)",
            "fr": "Heure de Colombie (Bogotá)",
            "de": "Kolumbianische Zeit (Bogotá)",
            "ru": "Колумбийское время (Богота)",
            "ar": "توقيت كولومبيا (بوغوتا)"
        }
    },
    "America/Lima": {
        "utc_offset": "-05:00",
        "name": {
            "zh": "秘鲁时间（利马）",
            "en": "Peru Time (Lima)",
            "ja": "ペルー時間（リマ）",
            "ko": "페루 시간 (리마)",
            "es": "Hora de Perú (Lima)",
            "fr": "Heure du Pérou (Lima)",
            "de": "Peruanische Zeit (Lima)",
            "ru": "Перуанское время (Лима)",
            "ar": "توقيت بيرو (ليما)"
        }
    },
    "America/Santiago": {
        "utc_offset": "-04:00",
        "name": {
            "zh": "智利时间（圣地亚哥）",
            "en": "Chile Time (Santiago)",
            "ja": "チリ時間（サンティアゴ）",
            "ko": "칠레 시간 (산티아고)",
            "es": "Hora de Chile (Santiago)",
            "fr": "Heure du Chili (Santiago)",
            "de": "Chilenische Zeit (Santiago)",
            "ru": "Чилийское время (Сантьяго)",
            "ar": "توقيت تشيلي (سانتياغو)"
        }
    },
    "America/Argentina/Buenos_Aires": {
        "utc_offset": "-03:00",
        "name": {
            "zh": "阿根廷时间（布宜诺斯艾利斯）",
            "en": "Argentina Time (Buenos Aires)",
            "ja": "アルゼンチン時間（ブエノスアイレス）",
            "ko": "아르헨티나 시간 (부에노스아이레스)",
            "es": "Hora de Argentina (Buenos Aires)",
            "fr": "Heure d'Argentine (Buenos Aires)",
            "de": "Argentinische Zeit (Buenos Aires)",
            "ru": "Аргентинское время (Буэнос-Айрес)",
            "ar": "توقيت الأرجنتين (بوينس آيرس)"
        }
    },
    "America/Sao_Paulo": {
        "utc_offset": "-03:00",
        "name": {
            "zh": "巴西时间（圣保罗）",
            "en": "Brazil Time (São Paulo)",
            "ja": "ブラジル時間（サンパウロ）",
            "ko": "브라질 시간 (상파울루)",
            "es": "Hora de Brasil (São Paulo)",
            "fr": "Heure du Brésil (São Paulo)",
            "de": "Brasilianische Zeit (São Paulo)",
            "ru": "Бразильское время (Сан-Паулу)",
            "ar": "توقيت البرازيل (ساو باولو)"
        }
    },
    "Atlantic/Azores": {
        "utc_offset": "-01:00",
        "name": {
            "zh": "亚速尔群岛时间",
            "en": "Azores Time",
            "ja": "アゾレス時間",
            "ko": "아조레스 시간",
            "es": "Hora de las Azores",
            "fr": "Heure des Açores",
            "de": "Azoren-Zeit",
            "ru": "Азорское время",
            "ar": "توقيت الأزور"
        }
    },
    "Europe/London": {
        "utc_offset": "+00:00",
        "name": {
            "zh": "格林尼治标准时间（伦敦）",
            "en": "Greenwich Mean Time (London)",
            "ja": "グリニッジ標準時（ロンドン）",
            "ko": "그리니치 표준시 (런던)",
            "es": "Hora del Meridiano de Greenwich (Londres)",
            "fr": "Heure de Greenwich (Londres)",
            "de": "Mittlere Greenwich-Zeit (London)",
            "ru": "Среднее время по Гринвичу (Лондон)",
            "ar": "توقيت غرينتش (لندن)"
        }
    },
    "Europe/Lisbon": {
        "utc_offset": "+00:00",
        "name": {
            "zh": "葡萄牙时间（里斯本）",
            "en": "Portugal Time (Lisbon)",
            "ja": "ポルトガル時間（リスボン）",
            "ko": "포르투갈 시간 (리스본)",
            "es": "Hora de Portugal (Lisboa)",
            "fr": "Heure du Portugal (Lisbonne)",
            "de": "Portugiesische Zeit (Lissabon)",
            "ru": "Португальское время (Лиссабон)",
            "ar": "توقيت البرتغال (لشبونة)"
        }
    },
    "Europe/Berlin": {
        "utc_offset": "+01:00",
        "name": {
            "zh": "中欧时间（柏林）",
            "en": "Central European Time (Berlin)",
            "ja": "中央ヨーロッパ時間（ベルリン）",
            "ko": "중앙유럽 시간 (베를린)",
            "es": "Hora Central Europea (Berlín)",
            "fr": "Heure d'Europe Centrale (Berlin)",
            "de": "Mitteleuropäische Zeit (Berlin)",
            "ru": "Центральноевропейское время (Берлин)",
            "ar": "توقيت وسط أوروبا (برلين)"
        }
    },
    "Europe/Paris": {
        "utc_offset": "+01:00",
        "name": {
            "zh": "中欧时间（巴黎）",
            "en": "Central European Time (Paris)",
            "ja": "中央ヨーロッパ時間（パリ）",
            "ko": "중앙유럽 시간 (파리)",
            "es": "Hora Central Europea (París)",
            "fr": "Heure d'Europe Centrale (Paris)",
            "de": "Mitteleuropäische Zeit (Paris)",
            "ru": "Центральноевропейское время (Париж)",
            "ar": "توقيت وسط أوروبا (باريس)"
        }
    },
    "Europe/Madrid": {
        "utc_offset": "+01:00",
        "name": {
            "zh": "中欧时间（马德里）",
            "en": "Central European Time (Madrid)",
            "ja": "中央ヨーロッパ時間（マドリード）",
            "ko": "중앙유럽 시간 (마드리드)",
            "es": "Hora Central Europea (Madrid)",
            "fr": "Heure d'Europe Centrale (Madrid)",
            "de": "Mitteleuropäische Zeit (Madrid)",
            "ru": "Центральноевропейское время (Мадрид)",
            "ar": "توقيت وسط أوروبا (مدريد)"
        }
    },
    "Europe/Rome": {
        "utc_offset": "+01:00",
        "name": {
            "zh": "中欧时间（罗马）",
            "en": "Central European Time (Rome)",
            "ja": "中央ヨーロッパ時間（ローマ）",
            "ko": "중앙유럽 시간 (로마)",
            "es": "Hora Central Europea (Roma)",
            "fr": "Heure d'Europe Centrale (Rome)",
            "de": "Mitteleuropäische Zeit (Rom)",
            "ru": "Центральноевропейское время (Рим)",
            "ar": "توقيت وسط أوروبا (روما)"
        }
    },
    "Europe/Amsterdam": {
        "utc_offset": "+01:00",
        "name": {
            "zh": "中欧时间（阿姆斯特丹）",
            "en": "Central European Time (Amsterdam)",
            "ja": "中央ヨーロッパ時間（アムステルダム）",
            "ko": "중앙유럽 시간 (암스테르담)",
            "es": "Hora Central Europea (Ámsterdam)",
            "fr": "Heure d'Europe Centrale (Amsterdam)",
            "de": "Mitteleuropäische Zeit (Amsterdam)",
            "ru": "Центральноевропейское время (Амстердам)",
            "ar": "توقيت وسط أوروبا (أمستردام)"
        }
    },
    "Europe/Stockholm": {
        "utc_offset": "+01:00",
        "name": {
            "zh": "中欧时间（斯德哥尔摩）",
            "en": "Central European Time (Stockholm)",
            "ja": "中央ヨーロッパ時間（ストックホルム）",
            "ko": "중앙유럽 시간 (스톡홀름)",
            "es": "Hora Central Europea (Estocolmo)",
            "fr": "Heure d'Europe Centrale (Stockholm)",
            "de": "Mitteleuropäische Zeit (Stockholm)",
            "ru": "Центральноевропейское время (Стокгольм)",
            "ar": "توقيت وسط أوروبا (ستوكهولم)"
        }
    },
    "Europe/Athens": {
        "utc_offset": "+02:00",
        "name": {
            "zh": "东欧时间（雅典）",
            "en": "Eastern European Time (Athens)",
            "ja": "東ヨーロッパ時間（アテネ）",
            "ko": "동유럽 시간 (아테네)",
            "es": "Hora de Europa Oriental (Atenas)",
            "fr": "Heure d'Europe de l'Est (Athènes)",
            "de": "Osteuropäische Zeit (Athen)",
            "ru": "Восточноевропейское время (Афины)",
            "ar": "توقيت شرق أوروبا (أثينا)"
        }
    },
    "Europe/Istanbul": {
        "utc_offset": "+03:00",
        "name": {
            "zh": "土耳其时间（伊斯坦布尔）",
            "en": "Turkey Time (Istanbul)",
            "ja": "トルコ時間（イスタンブール）",
            "ko": "터키 시간 (이스탄불)",
            "es": "Hora de Turquía (Estambul)",
            "fr": "Heure de Turquie (Istanbul)",
            "de": "Türkische Zeit (Istanbul)",
            "ru": "Турецкое время (Стамбул)",
            "ar": "توقيت تركيا (إسطنبول)"
        }
    },
    "Asia/Dubai": {
        "utc_offset": "+04:00",
        "name": {
            "zh": "海湾标准时间（迪拜）",
            "en": "Gulf Standard Time (Dubai)",
            "ja": "湾岸標準時（ドバイ）",
            "ko": "걸프 표준시 (두바이)",
            "es": "Hora Estándar del Golfo (Dubái)",
            "fr": "Heure Standard du Golfe (Dubaï)",
            "de": "Golf-Standardzeit (Dubai)",
            "ru": "Стандартное время Персидского залива (Дубай)",
            "ar": "التوقيت القياسي الخليجي (دبي)"
        }
    },
    "Asia/Karachi": {
        "utc_offset": "+05:00",
        "name": {
            "zh": "巴基斯坦标准时间（卡拉奇）",
            "en": "Pakistan Standard Time (Karachi)",
            "ja": "パキスタン標準時（カラチ）",
            "ko": "파키스탄 표준시 (카라치)",
            "es": "Hora Estándar de Pakistán (Karachi)",
            "fr": "Heure Standard du Pakistan (Karachi)",
            "de": "Pakistanische Standardzeit (Karatschi)",
            "ru": "Пакистанское стандартное время (Карачи)",
            "ar": "التوقيت القياسي الباكستاني (كراتشي)"
        }
    },
    "Asia/Kolkata": {
        "utc_offset": "+05:30",
        "name": {
            "zh": "印度标准时间（加尔各答）",
            "en": "India Standard Time (Kolkata)",
            "ja": "インド標準時（コルカタ）",
            "ko": "인도 표준시 (콜카타)",
            "es": "Hora Estándar de India (Calcuta)",
            "fr": "Heure Standard de l'Inde (Calcutta)",
            "de": "Indische Standardzeit (Kalkutta)",
            "ru": "Индийское стандартное время (Калькутта)",
            "ar": "التوقيت القياسي الهندي (كولكاتا)"
        }
    },
    "Asia/Dhaka": {
        "utc_offset": "+06:00",
        "name": {
            "zh": "孟加拉标准时间（达卡）",
            "en": "Bangladesh Standard Time (Dhaka)",
            "ja": "バングラデシュ標準時（ダッカ）",
            "ko": "방글라데시 표준시 (다카)",
            "es": "Hora Estándar de Bangladés (Daca)",
            "fr": "Heure Standard du Bangladesh (Dacca)",
            "de": "Bangladeschische Standardzeit (Dhaka)",
            "ru": "Бангладешское стандартное время (Дакка)",
            "ar": "التوقيت القياسي لبنغلاديش (دكا)"
        }
    },
    "Asia/Bangkok": {
        "utc_offset": "+07:00",
        "name": {
            "zh": "中南半岛时间（曼谷）",
            "en": "Indochina Time (Bangkok)",
            "ja": "インドシナ時間（バンコク）",
            "ko": "인도차이나 시간 (방콕)",
            "es": "Hora de Indochina (Bangkok)",
            "fr": "Heure d'Indochine (Bangkok)",
            "de": "Indochina-Zeit (Bangkok)",
            "ru": "Индокитайское время (Бангкок)",
            "ar": "توقيت الهند الصينية (بانكوك)"
        }
    },
    "Asia/Jakarta": {
        "utc_offset": "+07:00",
        "name": {
            "zh": "印度尼西亚西部时间（雅加达）",
            "en": "Western Indonesia Time (Jakarta)",
            "ja": "西インドネシア時間（ジャカルタ）",
            "ko": "서인도네시아 시간 (자카르타)",
            "es": "Hora de Indonesia Occidental (Yakarta)",
            "fr": "Heure de l'Indonésie Occidentale (Jakarta)",
            "de": "Westindonesische Zeit (Jakarta)",
            "ru": "Западноиндонезийское время (Джакарта)",
            "ar": "توقيت غرب إندونيسيا (جاكرتا)"
        }
    },
    "Asia/Shanghai": {
        "utc_offset": "+08:00",
        "name": {
            "zh": "中国标准时间（北京）",
            "en": "China Standard Time (Beijing)",
            "ja": "中国標準時（北京）",
            "ko": "중국 표준시 (베이징)",
            "es": "Hora Estándar de China (Pekín)",
            "fr": "Heure Standard de Chine (Pékin)",
            "de": "Chinesische Standardzeit (Peking)",
            "ru": "Китайское стандартное время (Пекин)",
            "ar": "التوقيت القياسي الصيني (بكين)"
        }
    },
    "Asia/Taipei": {
        "utc_offset": "+08:00",
        "name": {
            "zh": "台湾标准时间（台北）",
            "en": "Taiwan Standard Time (Taipei)",
            "ja": "台湾標準時（台北）",
            "ko": "대만 표준시 (타이베이)",
            "es": "Hora Estándar de Taiwán (Taipéi)",
            "fr": "Heure Standard de Taïwan (Taipei)",
            "de": "Taiwanesische Standardzeit (Taipeh)",
            "ru": "Тайваньское стандартное время (Тайбэй)",
            "ar": "التوقيت القياسي لتايوان (تايبيه)"
        }
    },
    "Asia/Hong_Kong": {
        "utc_offset": "+08:00",
        "name": {
            "zh": "香港时间",
            "en": "Hong Kong Time",
            "ja": "香港時間",
            "ko": "홍콩 시간",
            "es": "Hora de Hong Kong",
            "fr": "Heure de Hong Kong",
            "de": "Hongkong-Zeit",
            "ru": "Гонконгское время",
            "ar": "توقيت هونغ كونغ"
        }
    },
    "Asia/Singapore": {
        "utc_offset": "+08:00",
        "name": {
            "zh": "新加坡标准时间",
            "en": "Singapore Standard Time",
            "ja": "シンガポール標準時",
            "ko": "싱가포르 표준시",
            "es": "Hora Estándar de Singapur",
            "fr": "Heure Standard de Singapour",
            "de": "Singapur-Standardzeit",
            "ru": "Сингапурское стандартное время",
            "ar": "التوقيت القياسي لسنغافورة"
        }
    },
    "Asia/Seoul": {
        "utc_offset": "+09:00",
        "name": {
            "zh": "韩国标准时间（首尔）",
            "en": "Korea Standard Time (Seoul)",
            "ja": "韓国標準時（ソウル）",
            "ko": "한국 표준시 (서울)",
            "es": "Hora Estándar de Corea (Seúl)",
            "fr": "Heure Standard de Corée (Séoul)",
            "de": "Koreanische Standardzeit (Seoul)",
            "ru": "Корейское стандартное время (Сеул)",
            "ar": "التوقيت القياسي الكوري (سيول)"
        }
    },
    "Asia/Tokyo": {
        "utc_offset": "+09:00",
        "name": {
            "zh": "日本标准时间（东京）",
            "en": "Japan Standard Time (Tokyo)",
            "ja": "日本標準時（東京）",
            "ko": "일본 표준시 (도쿄)",
            "es": "Hora Estándar de Japón (Tokio)",
            "fr": "Heure Standard du Japon (Tokyo)",
            "de": "Japanische Standardzeit (Tokio)",
            "ru": "Японское стандартное время (Токио)",
            "ar": "التوقيت القياسي الياباني (طوكيو)"
        }
    },
    "Australia/Perth": {
        "utc_offset": "+08:00",
        "name": {
            "zh": "澳大利亚西部时间（珀斯）",
            "en": "Australian Western Standard Time (Perth)",
            "ja": "オーストラリア西部標準時（パース）",
            "ko": "호주 서부 표준시 (퍼스)",
            "es": "Hora Estándar Occidental de Australia (Perth)",
            "fr": "Heure Standard de l'Ouest Australien (Perth)",
            "de": "Westaustralische Standardzeit (Perth)",
            "ru": "Западноавстралийское стандартное время (Перт)",
            "ar": "التوقيت القياسي لغرب أستراليا (بيرث)"
        }
    },
    "Australia/Sydney": {
        "utc_offset": "+10:00",
        "name": {
            "zh": "澳大利亚东部时间（悉尼）",
            "en": "Australian Eastern Standard Time (Sydney)",
            "ja": "オーストラリア東部標準時（シドニー）",
            "ko": "호주 동부 표준시 (시드니)",
            "es": "Hora Estándar Oriental de Australia (Sídney)",
            "fr": "Heure Standard de l'Est Australien (Sydney)",
            "de": "Ostaustralische Standardzeit (Sydney)",
            "ru": "Восточноавстралийское стандартное время (Сидней)",
            "ar": "التوقيت القياسي لشرق أستراليا (سيدني)"
        }
    },
    "Pacific/Guam": {
        "utc_offset": "+10:00",
        "name": {
            "zh": "关岛时间",
            "en": "Guam Time",
            "ja": "グアム時間",
            "ko": "괌 시간",
            "es": "Hora de Guam",
            "fr": "Heure de Guam",
            "de": "Guam-Zeit",
            "ru": "Время Гуама",
            "ar": "توقيت غوام"
        }
    },
    "Pacific/Noumea": {
        "utc_offset": "+11:00",
        "name": {
            "zh": "新喀里多尼亚时间（努美阿）",
            "en": "New Caledonia Time (Noumea)",
            "ja": "ニューカレドニア時間（ヌメア）",
            "ko": "뉴칼레도니아 시간 (누메아)",
            "es": "Hora de Nueva Caledonia (Numea)",
            "fr": "Heure de Nouvelle-Calédonie (Nouméa)",
            "de": "Neukaledonische Zeit (Noumea)",
            "ru": "Новокаледонское время (Нумеа)",
            "ar": "توقيت كاليدونيا الجديدة (نوميا)"
        }
    },
    "Pacific/Auckland": {
        "utc_offset": "+12:00",
        "name": {
            "zh": "新西兰标准时间（奥克兰）",
            "en": "New Zealand Standard Time (Auckland)",
            "ja": "ニュージーランド標準時（オークランド）",
            "ko": "뉴질랜드 표준시 (오클랜드)",
            "es": "Hora Estándar de Nueva Zelanda (Auckland)",
            "fr": "Heure Standard de Nouvelle-Zélande (Auckland)",
            "de": "Neuseeländische Standardzeit (Auckland)",
            "ru": "Новозеландское стандартное время (Окленд)",
            "ar": "التوقيت القياسي لنيوزيلندا (أوكلاند)"
        }
    },
    "Pacific/Fiji": {
        "utc_offset": "+12:00",
        "name": {
            "zh": "斐济时间",
            "en": "Fiji Time",
            "ja": "フィジー時間",
            "ko": "피지 시간",
            "es": "Hora de Fiyi",
            "fr": "Heure de Fidji",
            "de": "Fidschi-Zeit",
            "ru": "Время Фиджи",
            "ar": "توقيت فيجي"
        }
    },
    "Pacific/Tongatapu": {
        "utc_offset": "+13:00",
        "name": {
            "zh": "汤加时间（汤加塔普）",
            "en": "Tonga Time (Tongatapu)",
            "ja": "トンガ時間（トンガタプ）",
            "ko": "통가 시간 (통가타푸)",
            "es": "Hora de Tonga (Tongatapu)",
            "fr": "Heure de Tonga (Tongatapu)",
            "de": "Tonga-Zeit (Tongatapu)",
            "ru": "Время Тонга (Тонгатапу)",
            "ar": "توقيت تونغا (تونغاتابو)"
        }
    }
}
const tz = {}
tz.root = "/app/code/dxmodules/zoneinfo/"
tz.languages = ["zh", "en", "ja", "ko", "es", "fr", "de", "ru", "ar"]
tz.getTimeZones = function (language) {
    if (!language) {
        return timezones
    } else if (!tz.languages.includes(language)) {
        throw new Error(`Language ${language} not supported`)
    }
    const filterTimezones = {}
    for (const [key, timezone] of Object.entries(timezones)) {
        filterTimezones[key] = {
            utc_offset: timezone.utc_offset,
            name: timezone.name[language]
        }
    }
    return filterTimezones
}
tz.updateTimeZone = function (timezoneKey) {
    if (!timezoneKey) {
        throw new Error("Timezone key is required")
    }
    const path = `${tz.root}${timezoneKey}`
    if (!dxstd.exist(path)) {
        throw new Error(`Timezone ${timezoneKey} not found`)
    }
    try {
        // avoid windows treat this command as virus
        let cmd = `${['c', 'p'].join('')} ${path} /etc/localtime`
        dxos.systemBrief(cmd)
        logger.info(`updated timezone to ${timezoneKey}, should reboot device to take effect`)
    } catch (error) {
        throw new Error(`Failed to update timezone ${timezoneKey}: ${error.message}`)
    }
}
tz.reboot = function () {
    dxos.systemBrief('sync')
    dxos.asyncReboot(2)
}

export default tz